//结构体的实例化需要所有字段一起起作用，而枚举的实例化只需要且只能是其中一个变体起作用。

struct myRectangle {
    mywidth: u32,
    myheight: u32
}

enum Shape {
    Rectangle {
        width:u32,height:u32
    },
    Triangle(
        (u32,u32),(u32,u32),(u32,u32)
    ),
    Circle{
        origin:(u32,u32),radius: u32
    },
    //myRectangle(Rectangle)
}

//
enum WebEvent {
    PageLoad,
    PageUnload,
    KeyPress(char),
    Paste(String),
    Click {x:i64,y:i64},
}


//给枚举每个变体赋予不同的值
enum Color {
    Red = 0xff0000,//也可以赋值一个起始数字
    Green = 0x00ff00,
    Blue = 0x0000ff
}

enum Number {
    Zero = 0,
    One,
    Two,
}


enum MyCal {
    Add,
    Substract,
}

impl MyCal {
    fn run(&self, x:i32,y:i32) -> i32 {
        match self {
            Self::Add=>x+y,
            Self::Substract => x-y,
        }
    }
}

pub fn print_enum_color(){
    println!("zero is {}",Number::Zero as i32);
    println!("one is {}",Number::One as i32);
    //这里表示打印出值的 16 进制形式，占位 6 个宽度，不足的用 0 补齐
    println!("roses are #{:06x}",Color::Red as i32);
    println!("violets are #{:06x}",Color::Blue as i32);
}

pub fn MyCal_demo() {
    //一般情况下，枚举会用来做配置，并结合 match 语句使用来做分支管理。
    // 如果要定义一个新类型，在 Rust 中主要还是使用结构体。
    let add = MyCal::Add;
    let result = add.run(110,220);
    println!("{result}")
}

#[derive(Debug)]
enum Shape_lcf {
    Rectangle,
    Triangle,
    Circle,
    //demo 测试类型
    student,
    teacher

}

pub fn shape_use_demo() {
    let var_lcf = Shape_lcf::student;  //创建一个刘彩芳的实例
    let lcf_type = match var_lcf {   //匹配刘彩芳的形状
        //在匹配刘彩芳的形状的过程中，必须写上所有可能的情况
        Shape_lcf::Rectangle => {
            println!("刘彩芳的形状是 {:?}",Shape_lcf::Rectangle);
            "矩形"
        }

        Shape_lcf::Triangle => {
            println!("刘彩芳的形状是 {:?}",Shape_lcf::Triangle);
            "三角形"
        }

        Shape_lcf::Circle => {
            println!("刘彩芳的形状是 {:?}",Shape_lcf::Circle);
            "圆形"
        }

        //如果剩下的不想处理，可以使用_占位符来偷懒
        _=> {
            println!("loser type");
            "loser"
        }
    };

    println!("{}",lcf_type);
}

//更加广泛的模式匹配
pub fn matter_match() {
    let number = 13;

    println!("Tell me about {}", number);
    let result = match number {
        1=>println!("one"),
        2|3|5|7|11 => println!("this is a prime"),
        13..=19=>println!("A teen"),
        _=> println!("Ain't special")
    };
    println!("{:?}",result);

    let str = "sentense";
    let result =match str {
        "aaa"=>println!("aaaa"),
        _=>println!("sentense")
    };

}
